from django import forms
from django.shortcuts import render,HttpResponse,redirect

class MyForm(forms.Form):
    # username字符串类型 最小3位 最大8位
    username = forms.CharField(min_length=3, max_length=8, label='用户名'
                               , initial='egon'
                               , required=True
                               , widget=forms.widgets.TextInput(attrs={'class': 'form-control'}))
    # password字符串类型 最小3位 最大8位
    password = forms.CharField(min_length=3, max_length=8, label='密码',
                               widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'}))

    confirm_password = forms.CharField(min_length=3, max_length=8, label='确认密码',
                                       widget=forms.widgets.PasswordInput(attrs={'class': 'form-control'}))
    # email 字段必须符合邮箱格式
    email = forms.EmailField(label='邮箱', widget=forms.widgets.EmailInput(attrs={'class': 'form-control'}))

    gender = forms.ChoiceField(
        choices=((1, "男"), (2, "女"), (3, "保密")),
        label="性别",
        initial=3,
        widget=forms.widgets.RadioSelect()
    )

    # 钩子函数
    # 局部函数
    def clean_username(self):
        # 获取到用户名
        username = self.cleaned_data.get('username')
        if '666' in username:
            # 提示前端报错信息
            self.add_error('username', '光喊666是不行滴~')
            # 将钩子函数钩取出来的数据再放回去
        return username

    # 全局钩子
    def clean(self):
        password = self.cleaned_data.get('password')
        confirm_password = self.cleaned_data.get('confirm_password')
        if not confirm_password == password:
            self.add_error('confirm_password', '两次密码不一致')
        return self.cleaned_data

    '''
    测试环境的准备  可以自己拷贝代码准备
    python console
    from app01 import views
    将带校验的数据组织成字典的形式传入即可
    form_obj=views.MyForm({'username':'jason','password':'12','email':'123'})
    form_obj.is_valid()
    False
    form_obj.cleaned_data 查看所有校验通过的数据
    {'username': 'jason'}
    form_obj.errors 查看所有不符合校验规则以及不符合的原因
    {'password': ['Ensure this value has at least 3 characters (it has 2).'], 'email': ['Enter a valid email address.']}


    form_obj=views.MyForm({'username':'jason','password':'123','email':'123@qq.com','hobby':'study'})
    form_obj.is_valid()
    True
    校验数据值校验类中出现的字段 多传不影响 多传的字段直接忽略  不能少传

    froms组件只会帮你渲染获取用户输入的标签

    label属性默认展示的是类中定义的字段首字母大写的形式
    '''


def index(request):
    # 1.先生成一个空对象
    form_obj = MyForm()
    # 2.直接将空对象传递给html页面
    if request.method == 'POST':
        '''
        1.数据获取繁琐
        2.校验数据需要构造成字典的格式传入
        ps:request.POST可以看成就是一个字典
        '''
        # 3.校验数据
        form_obj = MyForm(request.POST)
        # 4.判断数据是否合法
        if form_obj.is_valid():
            # 5.如果合法  操作数据库存储数据
            return HttpResponse('ok')
        # 6.不合法 有错误
        '''必备的条件 get和post请求传给html页面对象名必须一样'''
    return render(request, 'home.html', locals())
